package main

import (
	"database/sql"
	"flag"
	"log"
	"os"
	"os/signal"
	"syscall"

	"datasync/config"
	"datasync/db"
	"datasync/sync"
)

func main() {
	// 解析命令行参数
	configPath := flag.String("config", "config.yaml", "配置文件路径")
	flag.Parse()

	// 加载配置文件
	log.Printf("加载配置文件: %s", *configPath)
	cfg, err := config.LoadConfig(*configPath)
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	// 存储所有数据库连接，用于优雅关闭
	var dbConnections []*sql.DB
	defer func() {
		// 关闭所有数据库连接
		for _, db := range dbConnections {
			if err := db.Close(); err != nil {
				log.Printf("关闭数据库连接失败: %v", err)
			}
		}
		log.Println("所有数据库连接已关闭")
	}()

	// 启动所有同步任务
	for i, task := range cfg.SyncTasks {
		log.Printf("初始化同步任务 %d...", i+1)

		// 创建源数据库连接
		sourceDB, err := db.CreateConnection(&task.Source)
		if err != nil {
			log.Fatalf("创建源数据库连接失败: %v", err)
		}
		dbConnections = append(dbConnections, sourceDB)

		// 创建目标数据库连接
		targetDB, err := db.CreateConnection(&task.Target)
		if err != nil {
			log.Fatalf("创建目标数据库连接失败: %v", err)
		}
		dbConnections = append(dbConnections, targetDB)

		// 创建并启动同步服务
		syncService := sync.NewSyncService(sourceDB, targetDB, &task)
		if err := syncService.Start(); err != nil {
			log.Fatalf("启动同步服务失败: %v", err)
		}
	}

	log.Println("所有同步任务已启动，正在运行中...")

	// 设置信号处理，优雅退出
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan

	log.Println("收到退出信号，正在停止同步服务...")
}
